package personal.scanner;

public interface ScannerDFA {
    /**
     * @return 自动机的最大编号
     */
    int size();

    /**
     * @return 开始节点的编号
     */
    int startId();

    /**
     * @param transit 指定转移
     * @return 自动机是否存在指定转移
     */
    boolean isInTransitions(int transit);

    /**
     * 进行一次转移
     *
     * @param u       转移起点
     * @param transit 转移
     * @return 转移终点
     * @throws NullPointerException 不存在转移节点，即是非法转移
     */
    int transitTo(int u, int transit) throws NullPointerException;

    /**
     * @param u 指定节点
     * @return 指定节点是否是可接受的
     */
    boolean isAcceptable(int u);

    /**
     * @param u 指定节点
     * @return 指定节点的接受类型
     */
    Class getAcceptType(int u);

    /**
     * @param u 指定节点
     * @return 指定节点的默认异常类型
     */
    Class defaultException(int u);
}
